﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Insifo.WE;
using System.Text.RegularExpressions;
using System.Collections.Specialized;

public partial class seg_segUsuarioPerfilListar : ObjectPage
{
    #region PROPIEDADES

    public Dictionary<string, bool> ListaSeleccion
    {
        set { ViewState["Seleccion"] = value; }
        get
        {
            if (ViewState["Seleccion"] == null)
                ViewState["Seleccion"] = new Dictionary<string, bool>();
            return (Dictionary<string, bool>)ViewState["Seleccion"];
        }
    }

    public string FilaSeleccionadaID
    {
        set { ViewState["FilaSeleccionadaID"] = value; }
        get
        {
            if (ViewState["FilaSeleccionadaID"] == null)
                ViewState["FilaSeleccionadaID"] = string.Empty;
            return ViewState["FilaSeleccionadaID"].ToString();
        }
    }

    #endregion

    #region EVENTOS

    protected void Page_Load(object sender, EventArgs e)
    {
        //Eventos del Master
        Master.MenuAccionEvento += new MasterPageMenuEditarClickHandler(Master_MenuButton);
        if (!IsPostBack)
        {
            Cargar();
        }
    }

    protected void Master_MenuButton(object sender, EventArgs e)
    {
        string strAccion = ((CommandEventArgs)e).CommandName;
        switch (strAccion)
        {
            case "Aceptar":
                Guardar("G");
                break;
            case "Aplicar":
                Guardar("A");
                break;
            case "Exportar":
                Exportar();
                break;
            case "Cancelar":
                Salir();
                break;
        }
    }

    protected void lvUsuario_ItemCommand(object sender, ListViewCommandEventArgs e)
    {
        SeleccionarFila(e.CommandName);
        //Se guarda el id de la Aplicacion
        string[] str = e.CommandArgument.ToString().Split('|') ;
        hfUsuarioPerfil.Value = str[0];
        hfTipo.Value = str[1];
        //Muestra los usuarios de la aplicacion seleccionada
        MostrarAsociados();

    }

    protected void lvUsuario_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            HtmlTableRow htr = (HtmlTableRow)e.Item.FindControl("TrFila");
            ImageButton img = (ImageButton)e.Item.FindControl("ibtSeleccionar");
            img.CommandName = htr.UniqueID;
        }
    }

    protected void lvAsociado_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            bool blnSeleccion = Convert.ToBoolean(DataBinder.Eval(e.Item.DataItem, "Seleccion"));
            string strKey = DataBinder.Eval(e.Item.DataItem, "CodigoUsuario").ToString();
            CheckBox chkSeleccion = (CheckBox)e.Item.FindControl("chkSeleccion");
            if (ListaSeleccion.ContainsKey(strKey))
                chkSeleccion.Checked = ListaSeleccion[strKey];
            else
                chkSeleccion.Checked = blnSeleccion;

            if (blnSeleccion)
            {
                chkSeleccion.ForeColor = System.Drawing.ColorTranslator.FromHtml("#06CA06");
            }

            if (DataBinder.Eval(e.Item.DataItem, "Estado").ToString().Equals(Constantes.ESTADO_INACTIVO))
            {
                Label lblEstado = (Label)e.Item.FindControl("lblEstado");
                if (lblEstado != null)
                {
                    lblEstado.ForeColor = System.Drawing.ColorTranslator.FromHtml("#ff6230");
                }
            }
        }
    }

    //protected void ddlAplicacion_SelectedIndexChanged(object sender, EventArgs e)
    //{
    //    SeleccionarAplicacionTipo();
    //}
    //protected void ddlTipo_SelectedIndexChanged(object sender, EventArgs e)
    //{
    //    SeleccionarAplicacionTipo();
    //}
    protected void ibtBuscarPerfil_Click(object sender, ImageClickEventArgs e)
    {
        //Se lista los usuarios de la aplicacion
        MostrarListadoUsuarios();
    }

    protected void ibtBuscar_Click(object sender, ImageClickEventArgs e)
    {
        //Se guarda los usuario seleccionados en forma temporal
        EstablecerSeleccionLista();
        //Se establece los filtros de busqueda
        EstablecerFiltrosAsociado();
        //Se lista los usuarios de la aplicacion
        ucpagListaAsociado.NumeroPagina = 1;
        ListarAsociadoListView();
    }

    protected void ucpagListaAsociado_CambioPagina(object sender, EventArgs e)
    {
        ListarAsociadoListView();
    }

    protected void ucpagLista_CambioPagina(object sender, EventArgs e)
    {
        ListarUsuarioListView();
    }
    #endregion

    #region METODOS

    /// <summary>
    /// Se establece los filtros de la busqueda del usuario
    /// </summary>
    protected void EstablecerFiltrosAsociado()
    {
        ViewState["CodigoAsociado"] = txtCodigoAsociado.Text.Trim();
        ViewState["DescripcionAsociado"] = txtDescripcionAsociado.Text.Trim();
        ViewState["EstadoAsociado"] = ddlEstadoAsociado.SelectedValue;
    }

    /// <summary>
    /// Se establece los filtros de la busqueda del usuario
    /// </summary>
    protected void EstablecerFiltrosUsuario()
    {
        ViewState["CodigoUsuario"] = txtCodigoUsuario.Text.Trim();
        ViewState["DescripcionUsuario"] = txtDescripcionUsuario.Text.Trim();
        ViewState["TipoUsuario"] = ddlTipoUsuario.SelectedValue;
        ViewState["EstadoUsuario"] = ddlEstadoUsuario.SelectedValue;
        ucpagLista.NumeroPagina = 1;
    }

    /// <summary>
    /// Se guarda los usuarios seleccionado de la lista
    /// </summary>
    protected void EstablecerSeleccionLista()
    {
        bool blnSeleccion = false;
        string strKey = string.Empty;
        CheckBox chkSeleccion = null;
        for (int i = 0; i < lvAsociado.Items.Count; i++)
        {
            strKey = lvAsociado.DataKeys[i]["CodigoUsuario"].ToString();
            blnSeleccion = Convert.ToBoolean(lvAsociado.DataKeys[i]["Seleccion"]);
            chkSeleccion = (CheckBox)lvAsociado.Items[i].FindControl("chkSeleccion");
            if (chkSeleccion.Checked != blnSeleccion)
            {
                if (ListaSeleccion.ContainsKey(strKey))
                    ListaSeleccion[strKey] = chkSeleccion.Checked;
                else
                    ListaSeleccion.Add(strKey, chkSeleccion.Checked);
            }
            else
            {
                if (ListaSeleccion.ContainsKey(strKey))
                    ListaSeleccion.Remove(strKey);
            }
        }
    }

    /// <summary>
    /// Se oculta el listado de usuario por aplicacion
    /// </summary>
    /// <param name="blnMostrar">Ocultar Formulario de Usuario</param>
    protected void MostrarPanelEnBlanco(bool blnMostrar)
    {
        pnlFormulario.Style["display"] = blnMostrar ? "none" : "block";
        pnlSeleccioneAplicacion.Style["display"] = blnMostrar ? "block" : "none";
        lvAsociado.Visible = !blnMostrar;
        ucpagListaAsociado.Visible = !blnMostrar;
    }

    /// <summary>
    /// Seleccionar Suite
    /// </summary>
    protected void MostrarListadoUsuarios()
    {
        ucpagLista.NumeroPagina = 1;
        //Se limpia la lista de Seleccion
        ListaSeleccion.Clear();
        //Se establece los filtros de busqueda del Usuario
        EstablecerFiltrosUsuario();
        //Se lista las aplicaciones
        ListarUsuarioListView();
        //Se oculta el formulario de Usuario
        MostrarPanelEnBlanco(true);
    }


    /// <summary>
    /// Muestra los usuarios del perfil seleccionado
    /// </summary>
    protected void MostrarAsociados()
    {
        //Se limpia la lista de Seleccion
        ListaSeleccion.Clear();
        //Se establece los filtros de busqueda del perfil
        EstablecerFiltrosAsociado();
        //Se lista los Usuarios de la Aplicacion
        ucpagListaAsociado.NumeroPagina = 1;
        ListarAsociadoListView();
        //Se muestra el formulario de Usuario
        MostrarPanelEnBlanco(false);
    }




    /// <summary>
    /// Marca la seleccion de la fila de perfil
    /// </summary>
    /// <param name="pstrFilaId"></param>
    protected void SeleccionarFila(string pstrFilaId)
    {
        if (!string.IsNullOrEmpty(FilaSeleccionadaID))
            ((HtmlControl)this.Form.FindControl(FilaSeleccionadaID)).Attributes["class"] = string.Empty;
        ((HtmlControl)this.Form.FindControl(pstrFilaId)).Attributes["class"] = "lista-seleccion";
        FilaSeleccionadaID = pstrFilaId;
    }

    /// <summary>
    /// Listado de Aplicaciones
    /// </summary>
    protected void ListarAsociadoListView()
    {
        int intTotalFilas = 0, intFilasXPagina = 0;
        string strPerfil = hfUsuarioPerfil.Value;
        string strTipo = hfTipo.Value;
        string strCodigoUsuario = txtCodigoAsociado.Text;
        string strNombreUsuario = txtDescripcionAsociado.Text;
        string strNombre = ViewState["DescripcionAsociado"].ToString();
        string strEstado = ViewState["EstadoAsociado"].ToString();
        //Establece el listado de los Reportes
        DataTable dt = ListarUsuarioXPerfil(strPerfil, strTipo, strCodigoUsuario, strNombreUsuario, strEstado, ddlAsignado.SelectedValue, ucpagListaAsociado.NumeroPagina);
        lvAsociado.DataSource = dt;
        lvAsociado.DataBind();
        if (dt.Rows.Count > 0)
        {
            intFilasXPagina = Convert.ToInt32(dt.Rows[0]["FilasXPagina"]);
            intTotalFilas = Convert.ToInt32(dt.Rows[0]["TotalFilas"]);
        }
        ucpagListaAsociado.TotalRegistros = intTotalFilas;
        ucpagListaAsociado.RegistrosPorPagina = intFilasXPagina;
        ucpagListaAsociado.EnlazarPaginador();
    }

    /// <summary>
    /// Listado de Usuarios
    /// </summary>
    protected void ListarUsuarioListView()
    {
        int intTotalFilas = 0, intFilasXPagina = 0;
        string strPerfil = hfUsuarioPerfil.Value;
        string strCodigoUsuario = ViewState["CodigoUsuario"].ToString();
        string strNombre = ViewState["DescripcionUsuario"].ToString();
        string strTipo = ViewState["TipoUsuario"].ToString();
        string strEstado = ViewState["EstadoUsuario"].ToString();

        DataTable dt = ListarUsuario(strCodigoUsuario, strNombre, strTipo, strEstado, ucpagLista.NumeroPagina);
        lvUsuario.DataSource = dt;
        lvUsuario.DataBind();

        if (dt.Rows.Count > 0)
        {
            intFilasXPagina = Convert.ToInt32(dt.Rows[0]["FilasXPagina"]);
            intTotalFilas = Convert.ToInt32(dt.Rows[0]["TotalFilas"]);
        }
        ucpagLista.TotalRegistros = intTotalFilas;
        ucpagLista.RegistrosPorPagina = intFilasXPagina;
        ucpagLista.EnlazarPaginador();
        this.Master.MenuExportar.Visible = true;
    }

    protected void Cargar()
    {
        this.Master.MenuSalir.Visible = false;
        Master.SubTitulo.Text = Resources.resDiccionario.Editar;
        Master.MenuAplicar.Visible = false;
        string strAccion = Request.QueryString["a"];   //a: N-Nuevo, e-Editar, v-Ver
        string strId = Request.QueryString["i"];  //Id

        DataTable dtEstado = ListarParametroDetalle(1, 1, Constantes.PARAMETRO_ESTADOREGISTRO);
        //Carga los Estado del Perfil
        Util.loadCombo(ddlEstadoUsuario, dtEstado, "Descripcion", "ParametroDetalle");
        //Carga los Estado del Usuario
        Util.loadCombo(ddlEstadoAsociado, dtEstado, "Descripcion", "ParametroDetalle");
        //Carga los Tipo de Usuario
        Util.loadComboAndItem(ddlTipoUsuario, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_TIPOUSUARIO), "Descripcion", "ParametroDetalle", string.Format("--{0}--", Resources.resDiccionario.Todos), "");
        Util.SelectCombo(ddlTipoUsuario, Constantes.TIPOUSUARIO_USUARIO);
        

        //Seleccion
        List<ListItem> lstSeleccion = new List<ListItem>()
        {
            new ListItem(){ Text=string.Format("--{0}--",Resources.resDiccionario.Todos), Value=string.Empty},
            new ListItem(){ Text=Resources.resDiccionario.Asignado, Value="S"},
            new ListItem(){ Text=Resources.resDiccionario.NoAsignado, Value="N"},
        };
        //ddlSeleccionFuncion.Items.AddRange(lstSeleccion.ToArray());
        ddlAsignado.Items.AddRange(lstSeleccion.ToArray());
        Util.SelectCombo(ddlAsignado, "S");

        ucpagLista.NumeroPagina = 1;
        ucpagListaAsociado.NumeroPagina = 1;
        //Carga la Informacion de los Perfiles
        //BuscarPerfiles();
        MostrarListadoUsuarios();
        MostrarPanelEnBlanco(true);
    }

    protected bool Validar(out WCUsuarioPerfil.BEUsuario pbe)
    {
        string strUsuarioPerfil = hfUsuarioPerfil.Value; //Puede ser Usuario o Perfil
        bool blnSeleccion = false;
        WCUsuarioPerfil.BEUsuarioPerfil beUsuarioPerfil = null;
        CheckBox chkSeleccion = null;

        //Usuarios
        List<WCUsuarioPerfil.BEUsuarioPerfil> bePerfilUsuarios = new List<WCUsuarioPerfil.BEUsuarioPerfil>();
        for (int i = 0; i < lvAsociado.Items.Count; i++)
        {
            blnSeleccion = Convert.ToBoolean(lvAsociado.DataKeys[i]["Seleccion"]);
            chkSeleccion = (CheckBox)lvAsociado.Items[i].FindControl("chkSeleccion");
            if (chkSeleccion.Checked != blnSeleccion)
            {
                beUsuarioPerfil = new WCUsuarioPerfil.BEUsuarioPerfil();
                beUsuarioPerfil.Perfil = (hfTipo.Value == "PE") ? strUsuarioPerfil : lvAsociado.DataKeys[i]["CodigoUsuario"].ToString();
                beUsuarioPerfil.CodigoUsuario = (hfTipo.Value == "PE") ? lvAsociado.DataKeys[i]["CodigoUsuario"].ToString() : strUsuarioPerfil;
                beUsuarioPerfil.Estado = chkSeleccion.Checked ? Constantes.ESTADO_ACTIVO : Constantes.ESTADO_INACTIVO;
                beUsuarioPerfil.UsuarioCreacion = UsuarioSistema.CodigoUsuario;
                bePerfilUsuarios.Add(beUsuarioPerfil);
            }
        }

        //Inicializa
        WCUsuarioPerfil.BEUsuario be = new WCUsuarioPerfil.BEUsuario
        {
            PerfilUsuarios = bePerfilUsuarios.ToArray()
        };
        pbe = be;
        return true;
    }

    protected void Guardar(string pstrEvento) //G:Grabar, A:Aplicar
    {
        string strAccion = string.Empty;
        string strUsuario = string.Empty;
        strUsuario = UsuarioSistema.CodigoUsuario;
        WCUsuarioPerfil.BEUsuario be;
        if (!Validar(out be)) //Valida e Inicializa
        {
            return;
        }

        be = InsertarUsuarioPerfil(be);
        if (be.Error != 0)
            Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrarUsuario));

        if (pstrEvento == "G") //Si es GRABAR redirecciona a la Lista
        {
            if (be.Error == 0)
            {
                MostrarListadoUsuarios();
            }
        }
        else
        {
            //BuscarPerfiles();
            //SeleccionarFila(FilaSeleccionadaID);
            MostrarAsociados();
        }

    }

    protected void Exportar()
    {
        UtilExcel ut = new UtilExcel();

        string strPerfil = hfUsuarioPerfil.Value;
        string strTipo = hfTipo.Value;
        string strCodigoUsuario = txtCodigoAsociado.Text;
        string strNombreUsuario = txtDescripcionAsociado.Text;
        string strNombre = ViewState["DescripcionAsociado"].ToString();
        string strEstado = ViewState["EstadoAsociado"].ToString();
        //Establece el listado de los Reportes
        DataTable dt = ListarUsuarioXPerfil(strPerfil, strTipo, strCodigoUsuario, strNombreUsuario, strEstado, ddlAsignado.SelectedValue, 0);
       

        dt.Columns.Remove("FilasXPagina");
        dt.Columns.Remove("TotalFilas");
        ut.ExportaAExcelHoja(dt, Resources.resDiccionario.Archivo, Resources.resDiccionario.Datos);
    }

    protected void Salir()
    {
        //Util.Redireciona(RUTA_LISTA, "?a=l", true);
    }

    #endregion

    #region LLAMDAS A WEBSERVICES

    /// <summary>
    /// Método los usuarios del perfil
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCUsuarioPerfil.BEUsuario InsertarUsuarioPerfil(WCUsuarioPerfil.BEUsuario pbe)
    {
        WCUsuarioPerfil.BEUsuario be = new WCUsuarioPerfil.BEUsuario();
        using (var client = new ServiceClient<WCUsuarioPerfil.IWCUsuarioPerfil>("BasicHttpBinding_IWCUsuarioPerfil"))
        {
            var response = client.ServiceOperation<WCUsuarioPerfil.BEUsuario>(c => c.Insertar(pbe));
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Lista de Aplicaciones
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarPerfilPorAsignacion(string pstrCodigoPerfil, string pstrNombrePerfil, string pstrEstadoPerfil, int pinPagina)
    {
        WCUsuario.BEUsuario be = new WCUsuario.BEUsuario();
        be.CodigoUsuario = pstrCodigoPerfil;
        be.Nombre = pstrNombrePerfil;
        be.Estado = pstrEstadoPerfil;
        be.Pagina = pinPagina;

        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.ListarPorPerfilAsignacion(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Usuario por Reporte
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarUsuarioXPerfil(string pstrPerfil, string pstrTipo, string pstrCodigoUsuario, string pstrNombreUsuario, string pstrEstadoUsuario, string pstrAsignado, int pinPagina)
    {
        WCUsuarioPerfil.BEUsuarioPerfil be = new WCUsuarioPerfil.BEUsuarioPerfil();
        be.Perfil = pstrPerfil;
        be.Tipo = pstrTipo;
        be.CodigoUsuario = pstrCodigoUsuario;
        be.Nombre = pstrNombreUsuario;
        be.Estado = pstrEstadoUsuario;
        be.Asignado = pstrAsignado;
        be.Pagina = pinPagina;

        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuarioPerfil.IWCUsuarioPerfil>("BasicHttpBinding_IWCUsuarioPerfil"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Lista los Usuarios
    /// </summary>
    /// <returns></returns>
    protected DataTable ListarUsuario(string pstrCodigoUsuario, string pstrNombre, string pstrTipo, string pstrEstado, int pintPagina)
    {
        DataTable dt = new DataTable();
        WCUsuario.BEUsuario beUsuario = new WCUsuario.BEUsuario();
        beUsuario.CodigoUsuario = pstrCodigoUsuario;
        beUsuario.Nombre = pstrNombre;
        beUsuario.Tipo = pstrTipo;
        beUsuario.Estado = pstrEstado;
        beUsuario.Pagina = pintPagina;
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<DataTable>(
                c => c.Listar(beUsuario).Tables[0]
                    );
            ;
            dt = response;
        }
        return dt;
    }


    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarParametroDetalle(int pintidCompania, int pintIdAplicacion, string pstrParametro)
    {
        WCParametroDetalle.BEParametroDetalle be = new WCParametroDetalle.BEParametroDetalle();
        be.IdCompania = pintidCompania;
        be.IdAplicacion = pintIdAplicacion;
        be.Parametro = pstrParametro;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCParametroDetalle.IWCParametroDetalle>("BasicHttpBinding_IWCParametroDetalle"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }
    #endregion

}